A proxy is an image of an object where the object resides in a different logical and/or physical entity (e.g., machine, process, network). Proxies may be employed in distributed systems (where the proxy is a local image of a remote object) and in non-distributed systems (where the proxy is a local image of a local object). In distributed systems, proxies can be employed to facilitate local processing that may improve efficiency and call forwarding while in non-distributed systems proxies can be employed to facilitate actions like auditing and persisting an object. Proxies employed in remote processing may interact with a remote object that may reside across a remoting boundary (e.g., machine, domain). Proxies employed in local processing may interact with a local object that does not reside across a remoting boundary but which may still reside across a logical boundary (e.g., address space, process). When a method call is made to the object imaged by the proxy, conventional systems intercept the call and route it to the proxy, which is then able to perform system defined functions like forwarding the call to the object where the method is performed. The object that is imaged by the proxy then returns results to the proxy, which receives the results and is then able to again perform system defined functions like passing the results to the method caller. Changing the behavior of the system defined functions conventionally requires rewriting system code, which can be time consuming, expensive and introduce bugs into systems, and thus such changes are infrequently made.
Intercepting a method call invoked on an object that is imaged by a proxy is typically performed by a system-level object system and thus is not accessible to application developers. Similarly, data associated with the system-level object system is conventionally not available to application developers. Furthermore, conventional system-level object systems do not allow application developers to create proxies and thus conventional systems are inflexible and difficult to extend and/or adapt to various user contexts and needs. Thus, improvements to such systems are infrequently made.
Therefore there remains a need for a system and method to increase the flexibility of object systems to facilitate extending and/or adapting such object systems to various user contexts and needs.